package com.yuan.pay_mall.exception;

import com.yuan.pay_mall.enums.ResponseEnum;
import com.yuan.pay_mall.vo.ResponseVo;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Objects;

import static com.yuan.pay_mall.enums.ResponseEnum.ERROR;
//统一异常处理，异常捕获类
@ControllerAdvice
public class RuntimeExceptionHandler {
    @ExceptionHandler(RuntimeException.class)//要捕获异常的类
    @ResponseBody   //用以返回json格式
    //@ResponseStatus(HttpStatus.FORBIDDEN)  //返回HTTP的状态码，扩展知识，这个状态码和返回的json没有关系
    public ResponseVo handler(RuntimeException e){//异常传进去
        return ResponseVo.error(ERROR,e.getMessage());//返回通用的错误
    }
    @ExceptionHandler(UserLoginException.class)//捕获异常
    @ResponseBody
    public ResponseVo userLoginHandler(){//处理
        return ResponseVo.error(ResponseEnum.NEED_LOGIN);//返回值信息：用户未登录，请先登录
    }
/*cart购物车，方法参数未校验异常，
统一校验异常处理，用处很大
* */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseVo NotValidException(MethodArgumentNotValidException e){
        BindingResult bindingResult = e.getBindingResult();
        Objects.requireNonNull(bindingResult.getFieldError());
        return ResponseVo.error(ResponseEnum.PARAM_ERROR,
                bindingResult.getFieldError().getField()+" "//绑定的参数
                        +bindingResult.getFieldError().getDefaultMessage());//拼接错误信息，不能为null
    }
}


